package com.crm.service.impl;

import com.crm.base.BaseServiceImpl;
import com.crm.domain.vo.ModuleTreeVO;
import com.crm.domain.entity.Module;
import com.crm.domain.vo.MenuTreeVO;
import com.crm.mapper.ModuleMapper;
import com.crm.service.ModuleService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 模块业务层实现类
 */

@Service
public class ModuleServiceImpl extends BaseServiceImpl<ModuleMapper, Module> implements ModuleService {

    @Override
    public Boolean add(Module module) {
        return baseMapper.insert(module) > 0;
    }

    @Override
    public Boolean upd(Module module) {
        return baseMapper.update(module) > 0;
    }

    @Override
    public List<Module> findModuleByUid(Integer uId, String type) {
        return baseMapper.findModuleByUid(uId, type);
    }


    @Override
    public List<Integer> getModuleByRoleId(Integer roleId) {
        return baseMapper.findModuleByRid(roleId);
    }

    @Override
    public List<MenuTreeVO> getMenu(Integer uId) {
        return this.getMenuVo(0, baseMapper.findModuleByUid(uId, "3"));
    }

    @Override
    public List<ModuleTreeVO> findModule() {
        return this.getModuleDTO(0, baseMapper.select(null));
    }


    /**
     * 根据上级ID获取菜单树
     *
     * @param parentId 上级ID
     * @param list     模块列表
     * @return 菜单树
     */
    public List<MenuTreeVO> getMenuVo(Integer parentId, List<Module> list) {
        return list.stream()
                // 筛选出父级ID为parentId的模块
                .filter(module -> parentId.equals(module.getParentId()))
                // 映射为MenuVo
                .map(module -> new MenuTreeVO(module.getModuleName(), module.getModuleIcon(), module.getModuleUrl(), this.getMenuVo(module.getId(), list)))
                // 转换为List
                .collect(Collectors.toList());
    }

    /**
     * 根据上级ID获取模块权限树
     *
     * @param parentId 上级ID
     * @param list     模块列表
     * @return 模块权限树
     */
    public List<ModuleTreeVO> getModuleDTO(Integer parentId, List<Module> list) {
        return list.stream()
                // 筛选出父级ID为parentId的模块
                .filter(module -> parentId.equals(module.getParentId()))
                // 映射为ModuleDto
                .map(module -> new ModuleTreeVO(module.getId(), module.getParentId(), module.getModuleName(), this.getModuleDTO(module.getId(), list)))
                // 转换为List
                .collect(Collectors.toList());
    }
}
